React์ experimental_useEvent ํ ์ ์ดํด๋ณด์ธ์. ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ณ ๋ณต์กํ React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ์์ ์ ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค.
React experimental_useEvent: ์์ ์ ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ฌ์ธต ๋ถ์
React์ ๋ ๋๋ง ๋์์ ํนํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ค๋ฃฐ ๋ ์๊ธฐ์น ์์ ๋ฆฌ๋ ๋๋ง์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋งค ๋ ๋๋ง๋ง๋ค ์ปดํฌ๋ํธ์ ์ ํจ์๋ฅผ ์ ๋ฌํ๋ฉด ๋ถํ์ํ ์
๋ฐ์ดํธ๋ฅผ ์ ๋ฐํ์ฌ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. React ํ์์ ์คํ์ ์ธ ๊ธฐ๋ฅ์ผ๋ก ๋์
ํ experimental_useEvent ํ
์ ์์ ์ ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์์ฑํ์ฌ ์ปดํฌ๋ํธ๊ฐ ์ ๋ง ํ์ํ ๋๋ง ๋ฆฌ๋ ๋๋ง๋๋๋ก ํ๋ ๊ฐ๋ ฅํ ์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์๋ experimental_useEvent์ ํฌ๊ด์ ์ธ ํ์, ์ด์ , ๊ทธ๋ฆฌ๊ณ React ํ๋ก์ ํธ์์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํฉ๋๋ค.
experimental_useEvent๋ ๋ฌด์์ธ๊ฐ์?
experimental_useEvent๋ ๋ถ์์ ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ณ ์๋ React ํ
์
๋๋ค. ์ธ๋ผ์ธ์ผ๋ก ์ ์๋๊ฑฐ๋ ์ปดํฌ๋ํธ์ ๋ ๋ ํจ์ ๋ด์์ ์์ฑ๋๋ ์ ํต์ ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๋งค ๋ ๋๋ง๋ง๋ค ๋ค์ ์์ฑ๋ฉ๋๋ค. ์ด๋ ํด๋น ํธ๋ค๋ฌ๋ฅผ props๋ก ๋ฐ๋ ์์ ์ปดํฌ๋ํธ๋ ํธ๋ค๋ฌ์ ๋ก์ง์ด ๋์ผํ๋๋ผ๋ ๋ค์ ๋ ๋๋ง๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ํนํ ๊น๊ฒ ์ค์ฒฉ๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ด๋ํ ์ ์์ต๋๋ค.
experimental_useEvent ํ
์ ์์ ์ ์ธ ํจ์ ์์ด๋ดํฐํฐ๋ฅผ ์์ฑํจ์ผ๋ก์จ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. useEvent์์ ๋ฐํ๋ ํจ์๋ ํด๋ก์ ๋ก ๋ซ๋ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ๋ฆฌ๋ ๋๋ง ๊ฐ์ ๋ณํ์ง ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์์ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ฉด์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค. ์ด๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ปดํฌ๋ํธ์ ๋ ๋๋ง ์ฃผ๊ธฐ์์ ํจ๊ณผ์ ์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
์ค์ ์ฐธ๊ณ : ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด experimental_useEvent๋ ํ์ฌ ์คํ์ ์ธ ๊ธฐ๋ฅ์
๋๋ค. ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฉฐ ์์ ์ ์ธ API๋ก ๊ณต์ ์ถ์๋๊ธฐ ์ ๊น์ง๋ ํ๋ก๋์
ํ๊ฒฝ์ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด React ๊ตฌ์ฑ์์ ์คํ์ ์ธ ๊ธฐ๋ฅ์ ํ์ฑํํด์ผ ํฉ๋๋ค(์๋ ์ค๋ช
).
experimental_useEvent๋ฅผ ์ฌ์ฉํ๋ ์ด์ ?
experimental_useEvent์ ์ฃผ์ ์ด์ ์ ์ฑ๋ฅ ์ต์ ํ์
๋๋ค. ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํจ์ผ๋ก์จ React ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์์ฑ๊ณผ ํจ์จ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ค์์ ์ฃผ์ ์ฅ์ ์
๋๋ค:
- ์์ ์ ์ธ ํจ์ ์์ด๋ดํฐํฐ: ์ด ํ ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๊ฐ ๋ฆฌ๋ ๋๋ง ๊ฐ์ ๋์ผํ ์์ด๋ดํฐํฐ๋ฅผ ์ ์งํ๋๋ก ํ์ฌ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ๋ฆฌ๋ ๋๋ง ๊ฐ์: ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ํผํจ์ผ๋ก์จ
experimental_useEvent๋ ๋ธ๋ผ์ฐ์ ์ ์์ ๋ถํ๋ฅผ ์ต์ํํ์ฌ ๋ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. - ํฅ์๋ ์ฑ๋ฅ: ๋ฆฌ๋ ๋๋ง ๊ฐ์๋ ํนํ ๋ณต์กํ ์ปดํฌ๋ํธ๋ ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ๋ฅ ํฅ์์ผ๋ก ์ง๊ฒฐ๋ฉ๋๋ค.
- ๊ฐ์ํ๋ ์ปดํฌ๋ํธ ๋์์ธ:
experimental_useEvent๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ ๋๋ง ์ฃผ๊ธฐ์์ ๋ถ๋ฆฌํ์ฌ ์ปดํฌ๋ํธ ๋์์ธ์ ๋จ์ํํ๊ณ , ์ถ๋ก ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
experimental_useEvent ์ฌ์ฉ๋ฒ
experimental_useEvent๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ React ๊ตฌ์ฑ์์ ์คํ์ ์ธ ๊ธฐ๋ฅ์ ํ์ฑํํด์ผ ํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก webpack.config.js(๋๋ ์ ์ฌํ ๊ตฌ์ฑ ํ์ผ)์ ๋ค์์ ์ถ๊ฐํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค:
// webpack.config.js
module.exports = {
// ... other configurations
resolve: {
alias: {
'react': require.resolve('react', { paths: [require.resolve('./node_modules')] }),
'react-dom': require.resolve('react-dom', { paths: [require.resolve('./node_modules')] }),
},
},
plugins: [
new webpack.DefinePlugin({
__DEV__: JSON.stringify(true),
__PROFILE__: JSON.stringify(false),
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'),
__EXPERIMENTAL__: JSON.stringify(true), // Enable experimental features
}),
],
};
์ฐธ๊ณ : ์ ํํ ๊ตฌ์ฑ์ ํ๋ก์ ํธ์ ๋น๋ ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ ์ญ ์์๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ฒ๋ค๋ฌ์ ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์คํ์ ์ธ ๊ธฐ๋ฅ์ด ํ์ฑํ๋๋ฉด, ๋ค๋ฅธ React ํ
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ปดํฌ๋ํธ์์ experimental_useEvent๋ฅผ ์ํฌํธํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค:
import React, { useState } from 'react';
import { experimental_useEvent as useEvent } from 'react';
function MyComponent() {
const [count, setCount] = useState(0);
const handleClick = useEvent((value) => {
setCount(count + value);
console.log('Clicked!');
});
return (
<button onClick={() => handleClick(1)}>
Click me! Count: {count}
</button>
);
}
export default MyComponent;
์ค๋ช :
experimental_useEvent๋ฅผ ์ํฌํธํ๊ณ ๊ฐ๊ฒฐ์ฑ์ ์ํดuseEvent๋ก ๋ณ์นญ์ ์ง์ ํฉ๋๋ค.useEvent๋ฅผ ์ฌ์ฉํ์ฌhandleClick์ด๋ผ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ์ํฉ๋๋ค.useEventํ ๋ด๋ถ์์๋ `value` ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์count์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ํจ์๋ ์ค์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ก์ง์ ๋๋ค.useEventํ ์MyComponent์ ๋ฆฌ๋ ๋๋ง ์ ๋ฐ์ ๊ฑธ์ณhandleClickํจ์์ ์์ด๋ดํฐํฐ๊ฐ ์์ ์ ์ผ๋ก ์ ์ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค.handleClickํจ์๋ฅผ ๋ฒํผ์onClick์ด๋ฒคํธ์ ์ฐ๊ฒฐํ๊ณ ,1์ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค.
์ค์ฉ์ ์ธ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
experimental_useEvent๋ ๋ค์๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค์์ ํนํ ์ ์ฉํฉ๋๋ค:
- ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ props๋ก ๋ฐ๋ ์ปดํฌ๋ํธ: ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ๋ ๋ ์์ ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค.
- ๋ณต์กํ ๋ก์ง์ ๊ฐ์ง ์ด๋ฒคํธ ํธ๋ค๋ฌ: ๋ก์ง์ด ๋ฆฌ๋ ๋๋ง ๊ฐ์ ์ผ๊ด๋๊ฒ ์ ์ง๋์ด ์๊ธฐ์น ์์ ๋์์ ๋ฐฉ์งํฉ๋๋ค.
- ์ฑ๋ฅ์ ์ค์ํ ์ปดํฌ๋ํธ: ์์ฃผ ์ ๋ฐ์ดํธ๋๊ฑฐ๋ ๋ณต์กํ ๋ฐ์ดํฐ์ ์ํธ์์ฉํ๋ ์ปดํฌ๋ํธ์ ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
์์ 1: ์์ ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง ๋ฐฉ์ง
์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ณ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ๋ฌํ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์๋ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์:
import React, { useState, useCallback } from 'react';
function ChildComponent({ onClick }) {
console.log('Child Component Rendered');
return <button onClick={onClick}>Click Me (Child)</button>;
}
function ParentComponent() {
const [parentCount, setParentCount] = useState(0);
// Without useEvent: This will cause ChildComponent to re-render on every ParentComponent render
const handleClick = useCallback(() => {
console.log('Button Clicked in Parent');
}, []);
const handleClickWithUseEvent = useCallback(() => {
console.log('Button Clicked with useEvent');
}, []);
return (
<div>
<p>Parent Count: {parentCount}</p>
<button onClick={() => setParentCount(parentCount + 1)}>Increment Parent Count</button>
<ChildComponent onClick={handleClick} />
</div>
);
}
export default ParentComponent;
์ด ์์์์ ChildComponent๋ handleClick ํจ์์ ๋ก์ง์ด ๋์ผํ๊ฒ ์ ์ง๋๋๋ผ๋ ParentComponent๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค. ์ด๋ handleClick ํจ์๊ฐ ๋งค ๋ ๋๋ง๋ง๋ค ๋ค์ ์์ฑ๋์ด ์๋ก์ด ํจ์ ์์ด๋ดํฐํฐ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด useEvent๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
import React, { useState } => from 'react';
import { experimental_useEvent as useEvent } from 'react';
function ChildComponent({ onClick }) {
console.log('Child Component Rendered');
return <button onClick={onClick}>Click Me (Child)</button>;
}
function ParentComponent() {
const [parentCount, setParentCount] = useState(0);
const handleClick = useEvent(() => {
console.log('Button Clicked in Parent');
});
return (
<div>
<p>Parent Count: {parentCount}</p>
<button onClick={() => setParentCount(parentCount + 1)}>Increment Parent Count</button>
<ChildComponent onClick={handleClick} />
</div>
);
}
export default ParentComponent;
์ด์ ChildComponent๋ ์์ฒด props๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ปดํฌ๋ํธ ์์ฒด๊ฐ ์
๋ฐ์ดํธ๋์ด์ผ ํ ๋๋ง ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. handleClick ํจ์์ ์์ ์ ์ธ ์์ด๋ดํฐํฐ๋ ChildComponent๊ฐ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์ 2: ๋ณต์กํ ์ด๋ฒคํธ ๋ก์ง ์ฒ๋ฆฌ
experimental_useEvent๋ ๋ณต์กํ ๋ก์ง์ด๋ ๋น๋๊ธฐ ์์
์ ํฌํจํ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ค๋ฃฐ ๋๋ ์ ์ฉํฉ๋๋ค. ์์ ์ ์ธ ํจ์ ์์ด๋ดํฐํฐ๋ฅผ ๋ณด์ฅํจ์ผ๋ก์จ ์๊ธฐ์น ์์ ๋์์ ๋ฐฉ์งํ๊ณ ๋ฆฌ๋ ๋๋ง ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
import React, { useState, useEffect } from 'react';
import { experimental_useEvent as useEvent } from 'react';
function MyComponent() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const fetchData = useEvent(async () => {
setLoading(true);
try {
const response = await fetch('https://api.example.com/data');
const result = await response.json();
setData(result);
} catch (error) {
console.error('Error fetching data:', error);
} finally {
setLoading(false);
}
});
useEffect(() => {
// Initial data fetch or any other side effect
fetchData();
}, []);
return (
<div>
<button onClick={fetchData} disabled={loading}>
{loading ? 'Loading...' : 'Fetch Data'}
</button>
{data && <pre>{JSON.stringify(data, null, 2)}</pre>}
</div>
);
}
export default MyComponent;
์ด ์์์์ fetchData ํจ์๋ API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. experimental_useEvent๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋๋๋ผ๋ fetchData ํจ์๊ฐ ์์ ์ ์ผ๋ก ์ ์ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๊ฒฝ์ ์กฐ๊ฑด(race conditions)์ด๋ ์๊ธฐ์น ์์ ์
๋ฐ์ดํธ์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ ์ฌ์ ์ธ ๋จ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
experimental_useEvent๋ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ์ ์ฌ์ ์ธ ๋จ์ ๊ณผ ๊ณ ๋ ค ์ฌํญ์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์คํ์ ์ธ ์ํ: ์คํ์ ์ธ ๊ธฐ๋ฅ์ด๋ฏ๋ก API๋ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฉฐ ํ๋ก๋์ ํ๊ฒฝ์ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค.
- ๋ณต์ก์ฑ ์ฆ๊ฐ:
experimental_useEvent๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋ ์ ์์ผ๋ฉฐ, ํนํ ๊ทธ ๋์์ ์ต์ํ์ง ์์ ๊ฐ๋ฐ์์๊ฒ๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. - ๊ณผ์ฉ์ ๊ฐ๋ฅ์ฑ:
experimental_useEvent๋ฅผ ์ ์คํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ชจ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์์ ์ ์ธ ์์ด๋ดํฐํฐ๋ฅผ ์๊ตฌํ๋ ๊ฒ์ ์๋๋๋ค. ํ ์ ๊ณผ์ฉํ๋ฉด ๋ถํ์ํ ๋ณต์ก์ฑ๊ณผ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. - ํด๋ก์ ๋ฐ ์์กด์ฑ:
experimental_useEvent๊ฐ ํด๋ก์ ๋ฐ ์์กด์ฑ๊ณผ ์ด๋ป๊ฒ ์ํธ์์ฉํ๋์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.useEvent์ ์ ๊ณต๋ ํจ์๋ ์ฌ์ ํ ์ปดํฌ๋ํธ ์ค์ฝํ์ ๊ฐ์ ํด๋ก์ ๋ก ๋ซ์ง๋ง, ํจ์ ์์ฒด๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
experimental_useEvent์ ๋์
experimental_useEvent ์ด์ ์๋ ๊ฐ๋ฐ์๋ค์ด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ต์ ํํ๊ณ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ค๋ฅธ ๊ธฐ์ ์ ์์กดํ์ต๋๋ค. ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
useCallback:useCallbackํ ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ๋งค ๋ ๋๋ง๋ง๋ค ๋ค์ ์์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋useCallback์ ์์กด์ฑ ๊ด๋ฆฌ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ฉฐ, ์ด๋ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.- ํด๋์ค ์์ฑ์ ์ฌ์ฉํ ํด๋์ค ์ปดํฌ๋ํธ: ํด๋์ค ์ปดํฌ๋ํธ์์๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ๋ฐ์ธ๋ฉ๋๊ณ ๋ฆฌ๋ ๋๋ง ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๋ ํด๋์ค ์์ฑ์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํด๋์ค ์ปดํฌ๋ํธ๋ ์ผ๋ฐ์ ์ผ๋ก ํ ์ ์ฌ์ฉํ๋ ํจ์ํ ์ปดํฌ๋ํธ๋ณด๋ค ์ ํธ๋๊ฐ ๋ฎ์ต๋๋ค.
- ์์ ์ปดํฌ๋ํธ ์๋ ๋ฉ๋ชจ์ด์ ์ด์
:
React.memo๋๋useMemo๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ฉด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ปดํฌ๋ํธ์ props ๋ฐ ์์กด์ฑ์ ๋ํ ์ ์คํ ๋ถ์์ด ํ์ํฉ๋๋ค.
์ด๋ฌํ ๋์๋ค๋ ํจ๊ณผ์ ์ผ ์ ์์ง๋ง, experimental_useEvent๋ ํนํ ๋ณต์กํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์์ฃผ ์
๋ฐ์ดํธ๋๋ ์ปดํฌ๋ํธ์ ๋ํด ๋ ์ฐ์ํ๊ณ ์ง๊ด์ ์ธ ์๋ฃจ์
์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
experimental_useEvent ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
experimental_useEvent๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ํ์ํ ๋๋ง ์ฌ์ฉ:
experimental_useEvent๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ฑฐ๋ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ ๋ฐํ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์๋ง ์ ์ฉํ์ญ์์ค. - ์์กด์ฑ ์ดํด: ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ซ๋ ์์กด์ฑ์ ์ ์ํ์ญ์์ค. ์์กด์ฑ์ด ์์ ์ ์ด๊ฑฐ๋ ํด๋น ์ ๋ฐ์ดํธ๊ฐ ์ ์ ํ๊ฒ ์ฒ๋ฆฌ๋๋์ง ํ์ธํ์ญ์์ค.
- ์ฒ ์ ํ ํ
์คํธ:
experimental_useEvent๊ฐ ์์๋๋ก ์๋ํ๊ณ ์๊ธฐ์น ์์ ๋์์ ์ ๋ฐํ์ง ์๋์ง ํ์ธํ๊ธฐ ์ํด ์ปดํฌ๋ํธ๋ฅผ ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค. - ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: React Profiler ๋๋ ๊ธฐํ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ
experimental_useEvent๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ถ์ ํ์ญ์์ค. - ์ต์ ์ ๋ณด ์ ์ง:
experimental_useEvent๋ฐ ํฅํ ๊ฐ๋ฐ์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ์ํด React ๋ฌธ์ ๋ฐ ์ปค๋ฎค๋ํฐ ํ ๋ก ์ ์ฃผ์ํ์ญ์์ค.
๊ฒฐ๋ก
experimental_useEvent๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ต์ ํํ๊ณ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์
๋๋ค. ์์ ์ ์ธ ํจ์ ์์ด๋ดํฐํฐ๋ฅผ ์์ฑํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํจ์ผ๋ก์จ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ณ ์ปดํฌ๋ํธ ๋์์ธ์ ๋จ์ํํฉ๋๋ค. ์คํ์ ์ธ ์ํ์ ์ ์ฌ์ ์ธ ๋จ์ ์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํ์ง๋ง, experimental_useEvent๋ React ๊ฐ๋ฐ ํดํท์์ ๊ฐ๋ ฅํ ์์ฐ์ด ๋ ์ ์์ต๋๋ค. React ํ์ด API๋ฅผ ๊ณ์ํด์ ๊ฐ์ ํ๊ณ ์์ ํํจ์ ๋ฐ๋ผ experimental_useEvent๋ React ์ํ๊ณ์์ ์ ์ ๋ ์ค์ํ ๋ถ๋ถ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด ์คํ์ ์ธ ํ
์ ์ฑ
์๊ฐ ์๊ฒ ํ์ฉํ์ฌ ๋ ๋ถ๋๋ฝ๊ณ ํจ์จ์ ์ธ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฌ๋ ฅ์ ๋ฐํํ์ญ์์ค.
experimental_useEvent๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋์ง ํ์ธํ๊ธฐ ์ํด ํญ์ ์ฝ๋๋ฅผ ์ฒ ์ ํ ํ
์คํธํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ์ด ๊ธ์ ์ค๋ช
๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด experimental_useEvent๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ ํ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ณ ์ฑ๋ฅ์ ์ ์ง๋ณด์ ๊ฐ๋ฅํ React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๋ฉด์ฑ
์กฐํญ: ์ด ๊ธ์ ๊ฒ์์ผ ํ์ฌ experimental_useEvent์ ํ์ฌ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. API๋ ํฅํ React ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ํญ์ ์ต์ ์ ๋ณด๋ ๊ณต์ React ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.